#pragma once
#include "Logger.hpp"
#include <unistd.h>
#include "LogBuffer.hpp"
/*
1 提供获取指定日志器的全局接口，避免用户自己操作单例对象减少使用复杂度
2 提供宏函数让用户不用自己输入__FILE__, __LINE__者两个宏定义，代替日志器接口函数
*/

// 获取日志器对象
std::shared_ptr<MyLogger::Logger> GetLogger(const std::string &name)
{
    return MyLogger::LoggerManager::GerInsrance().GetLogger(name);
}

// 获取默认日志器对象,同步输出到标准输出
std::shared_ptr<MyLogger::Logger> GetDfLogger()
{
    return MyLogger::LoggerManager::GerInsrance().GetDfLogger();
}

// 提供标准输出的宏函数
#define DEBUG(fmt, ...) GetDfLogger()->Debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
#define INFOR(fmt, ...) GetDfLogger()->Infor(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
#define WARN(fmt, ...) GetDfLogger()->Warning(__FILE__, __LINE__, fmt,##__VA_ARGS__);
#define ERROR(fmt, ...) GetDfLogger()->Error(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
#define FATAL(fmt, ...) GetDfLogger()->Fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__);

// 其它输出，所谓的宏替换就是预处理阶段进行文本替换，因为代码也是文本，预处理把
// 宏定义的文本或者宏函数替换成对应的文本
#define Debug(fmt, ...) Debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
#define Infor(fmt, ...) Infor(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
#define Warning(fmt, ...) Warning(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
#define Error(fmt, ...) Error(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
#define Fatal(fmt, ...) Fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__);

/*
std::unique_ptr<MyLogger::LoggerBuilder> Buile = std::make_unique<MyLogger::BuildLocalLogger>("Log1");

    Buile->BuildLoggerType(MyLogger::LoggerType::LOGGER_USYNC);
    Buile->BuiltLogLand<LogToFile>("./Usynclog/log1.txt");
    std::shared_ptr<MyLogger::Logger> LogPtr = Buile->Build();
    MyLogger::LoggerManager::GerInsrance().AddLogger(LogPtr);
    for (int i = 0; i < 10000; i++)
    {
        //预处理阶段会把Fatal("%s%d", "测试功能1", 777);
        //替换成Fatal(__FILE__, __LINE__, "%s%d", "测试功能1", 777);
        //宏函数加文本替换，编译阶段再做语法检查，代码在编译之前都是文本
        //都可以进行替换，编译期间再检查语法即可
        LogPtr->Fatal("%s%d", "测试功能1", 777);
        //LogPtr->Infor(__FILE__, __LINE__, "%s%d", "测试功能2", 777);
        FATAL("%s%d", "测试功能1", 777);
    }
*/